// 头文件包含了函数声明，宏定义，结构体声明，变量声明。
// 比如stdio.h系统头文件包含了printf，scanf, fopen函数
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>
#include <unistd.h>
// 介绍基础数据类型。

// 科普：CPU，内存（RAM重启丢失），硬盘（重启不丢失）。程序运行，从硬盘读取到内存运行。

// 计算机储存：
// 位=1bit,最小储存单元，只能表示0,1。表示二进制。编程没有bit类型(bool类型实际占用空间为1byte。虽然有int i:1;这种定义，但是他实际占用空间4字节)。
// 字节Byte=8bits,基本数据单位。比如内存条为1T=1024G=2^10G=2^20M=2^30K=2^40byte的空间。
// 二进制   16进制  10进制
// 00000000 0x00   0
// 00000001 0x01   1
// 00000010 0x02   2
// 00000011 0x03   3
// 00000100 0x04   4
// 00000101 0x05   5
// 00000110 0x06   6
// 00000111 0x07   7
// 00001000 0x08   8
// 00001001 0x09   9
// 00001010 0x0a  10
// 00001011 0x0b  11
// 00001100 0x0c  12
// 00001101 0x0d  13
// 00001110 0x0e  14
// 00001111 0x0f  15
// 00010000 0x10  16
// 00010001 0x11  17
// 4位二进制刚好组成1位16进制

// 二进制：b01101001,对应十进制105，对应16进制0X69。可以通过计算器程序员模式查看。
// 二进制计算跟十进制类似：
//   b01011101
// + b11100011
// =b101000000
// char表示的有符号数，长度8bits，最高位0表示正，1表示负。他能表示-128到127
// uchar表示无符号数，0-255对应0x00-0xff
// 补码及作用：正数直接表示为二进制即可，负数为其正数取反加一。作用是加减法，计算器方便直接执行加运算。
// 2=b00000010
// -2则先用2=b00000010取反得到b11111101,然后加1得到b11111110。这就是计算机保存的内容。
// 试一下加法：2+(-2)=0
//   b00000010
// + b11111110
// =b000000000
// uint_8与int_8 ++情况一致。

// int main(void)也是可以的
int main(int argc, char **argv)
{
    // 基础变量,可以用sizeof查看占用内存大小
    //  %d有符号打印int能装下的整数。char, unsigned char，short, unsigned short, int, unsigned int，可以用%d打印出有符号的数据。
    //  %u无符号打印int能装下的整数。
    char value1 = -1;
    // sizeof返回值unsigned long类型，PC机需要用%lu， 32位系统用%u即可。
    printf("char value:%d, memery size:%lu\n", value1, sizeof(value1));
    //或者用%d整数输出，把sizeof强制转化为int型即可。
    printf("char value:%d, memery size:%d\n", value1, (int)sizeof(value1));

    unsigned char value2 = -1;
    printf("unsigned char value:%d, memery size:%lu\n", value2, sizeof(value2));

    // %d打印int能装下的整数。short, unsigned short 2个字节，可以用%d打印。
    short value3 = -1;
    printf("short value:%d, memery size:%lu\n", value3, sizeof(value3));
    unsigned short value4 = -1;
    printf("unsigned short value:%d, memery size:%lu\n", value4, sizeof(value4));

    // 对于51单片机，int占2字节；ARM，PC机等占4字节；。
    int value5 = -1;
    printf("int value:%d, memery size:%lu\n", value5, sizeof(value5));
    // %u无符号打印int能装下的整数。无符号整数赋值为-1，将他打印为有符号(%d)，
    unsigned int value6 = -1;
    // %d，会把无符号int转为有符号int！
    printf("unsigned int value:%d, memery size:%lu\n", value6, sizeof(value6));
    printf("unsigned int value:%u, memery size:%lu\n", value6, sizeof(value6));

    // 在32位系统，long是4字节；在64位系统，long占8字节。
    long value7 = -1;
    printf("long value:%ld, memery size:%lu\n", value7, sizeof(value7));
    unsigned long value8 = -1;
    printf("unsigned long value:%lu, memery size:%lu\n", value8, sizeof(value8));

    // long long 占8字节。
    long long value9 = -1;
    printf("long long value:%lld, memery size:%lu\n", value9, sizeof(value9));
    unsigned long long value10 = -1;
    printf("unsigned long long value:%llu, memery size:%lu\n", value10, sizeof(value10));

    float value11 = -1;
    printf("float value:%f, memery size:%lu\n", value11, sizeof(value11));

    double value12 = -1;
    printf("double value:%f, memery size:%lu\n", value12, sizeof(value12));
    // 用const修饰，表示常量。表示不能修改。
    // const int tmpConstValue = 1;
    // char buffer1[1];后面再说数据
    // short buffer1[2];
    // char *pointor;
    // struct xx value;
    //因为返回类型是int，因此return 整数;
    return 1;
}

// 输出：
//  ./test a b c
//  hello world!
